var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var favicon = require('serve-favicon');
var bodyParser = require('body-parser');
var exphbs = require('express-handlebars');
var flash = require('connect-flash');
var session = require('express-session');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;


var usersRouter = require('./routes/users');
var customerRouter = require('./routes/customer')
var menuRouter = require('./routes/menu')
var orderRouter = require('./routes/order')
var adminRouter = require('./routes/admin')
var foodadminRouter = require('./routes/foodadmin')

var web_login = require('./routes/web_login')
var web_find = require('./routes/web_find')
var web_menu = require('./routes/web_menu')
var helpers = require('./public/helpers/helpers')       //指定helpers文件




var app = express();


//设置解析json的中间件，设置解析url（字符串）的中间件
app.use(express.json());      //解析json类型
app.use(express.urlencoded({ extended: false }));     //解析字符串类型
// app.use(bodyParser.json());
// app.use(bodyParser.urlencoded({ extended: false }));

//加载静态资源目录
app.use(express.static(path.join(__dirname, 'public')));

// 模板引擎设置
// app.set('views', path.join(__dirname, 'views'));    //指定views路径，第一个参数是固定的，第二个参数拼接路径字符串
// app.set('view engine', 'ejs'); 
app.set('views', path.join(__dirname, 'views'));         //指定views路径
app.engine('handlebars', exphbs({         //使用的是默认拓展名,所以写'handlebars'
  defaultLayout: 'default',              //设置默认布局文件名为layout
  helpers: helpers,                     //指定helpers文件
  partialsDir: __dirname + '/views/partials',               //指定目录
  layoutsDir: __dirname + '/views/layouts'                 //指定目录
}));
app.set('view engine', 'handlebars');             //指定模板引擎

//把日志信息打印到控制台
app.use(logger('dev'));

// 设置网站的图标
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));


//小程序服务的路由绑定
app.use('/users', usersRouter);
app.use('/customer', customerRouter);
app.use('/menu', menuRouter);
app.use('/order', orderRouter);
app.use('/admin', adminRouter);
app.use('/foodadmin', foodadminRouter);


//不使用签名的cookie
app.use(cookieParser());


//配置session,passpord必要的中间件
app.use(session({
  secret: 'secret',//加密字符串
  resave: true,
  saveUninitialized: true
}));

// Passport init 身份验证模块passport初始化
app.use(passport.initialize());
app.use(passport.session());

//网站信息寄存器
// flash 可用于一次性的消息提示，比如注册，登录页面，当你再次刷新时，flash就没有提示消息了
app.use(flash());
app.use(function (req, res, next) {
  res.locals.success_msg = req.flash('success_msg');
  res.locals.error_msg = req.flash('error_msg');
  res.locals.user = req.user || null;
  next();
});

//解析handbars服务的路由绑定

app.use('/login', web_login);
app.use('/menu', web_menu);
app.use('/', web_find);



// catch 404 and forward to error handler
// 当于所有路径都不匹配时,报404,自定义
app.use(function (req, res, next) {
  // console.log('进入app.js的404代码1')
  next(createError(404));
  // next();
});


app.set('env', 'development');
// error handler
// 开发环境的错误处理
// 会打印出堆栈信息
if (app.get('env') === 'development') {
  // console.log('进入app.js的404代码2')
  app.use(function (err, req, res, next) {
    res.status(err.status || 500);
    res.render('web_error', {
      message: err.message,
      error: err
    });
  });
}

// error handler
// 生产环境下的错误处理
// 不会向用户输出堆栈信息
app.use(function (err, req, res, next) {
  // console.log('进入app.js的404代码3')
  res.status(err.status || 500);
  res.render('web_error', {
    message: err.message,
    error: {}
  });
});

// app.use(function(err, req, res, next) {
//   console.log('进入app.js的404代码4')
//   // set locals, only providing error in development
//   res.locals.message = err.message;
//   res.locals.error = req.app.get('env') === 'development' ? err : {};

//   // render the error page
//   res.status(err.status || 500);
//   res.render('error');
// });

module.exports = app;
